關於 Bash shell script 的函式(function)介紹,今天介紹的的就是『返回值』,有呼叫函式就有可能會有返回值。可是這返回值也很特別,不是要 return 什麼,而是要使用變數去接或者直接輸出(echo)訊息。而我個人比較偏好使用 echo 來接收返回值,我的理由就是-『全域變數越少越好』啦!
關於 Bash shell script 的函式(function)介紹,今天介紹的的就是『返回值』,有呼叫函式就有可能會有返回值。可是這返回值也很特別,不是要 return 什麼,而是要使用變數去接或者直接輸出(echo)訊息。而我個人比較偏好使用 echo 來接收返回值,我的理由就是-『全域變數越少越好』啦!
Shell Script 函式有返回值的操作方式:
function_name(){
    some command
    echo “Some thing”
}
# 呼叫 function _name 並取得該函式的返回值
result=$(function_name)
echo “取得返回值為 $result”
所以要取得函式返回值就必須使用 $() 將函式包起來,就可以取得返回值了!那麼就讓我們繼續來提高程式碼的可讀性囉!
#!/bin/bash
# Perfoce 指令
P4COMMAND=/usr/local/bin/p4
# workspace variables
MyProjectLog=/home/pajace_chen/Perforce_Check/MyProjectUpdateLog.log
# Perforce workspace
export MyProjectWorkspace=MyProject
# 要登入 Perfroce 所需的環境變數
export P4CLIENT=$MyProjectWorkspace
export P4PASSWD=1234567890
export P4USER=pajace2001
export P4PORT=192.168.0.1:1666
LogCodeChanged(){
    # 將第一個參數指派給 logFile 變數
    logFile=$1
    output=$2
    # 用 echo 記錄一些相關資料
    echo "`date`: My Project 的程式碼有更動." >> $ logFile
    echo "`date`: 觸發自動建置功能" >> $ logFile
    # 將執行 p4 sync 的結果寫到 log 檔案中
    echo "$output" >> $ logFile
}
LogNoChange(){
    $output=$1
    $logfile=$2
    # 沒有程式碼更動也寫一下 log 好做偵錯時使用
    echo "`date`: MyProject 中沒有程式碼更動. Output: $output " >> $logfile
}
TriggerAutoBuildMyProject(){
	#用 wget 去開啟網頁,觸發自動建置,不是真的需要網頁的內容
	wget http://192.168.0.2:8080/jenkins/job/MyProject/build?token=TriggerBuild
    # 因為使用 wget 去抓網頁,會留下不需要的檔案,所以刪掉他
    rm build?token*
}
LogoutPerforce(){
    $P4COMMAND logout
}
LoginPerforce(){
    # 這一步驟是要登入 perforce
    echo $P4PASSWD | $P4COMMAND login >&2
}
IsCodeChanged(){
    # $1 : p4 sync 所顯示的訊息
    output=$1
	
    # 如果執行 p4 sync 的結果有包含 MyProject
    if [[ "$output" =~ //MyProject* ]]; then
        return 1;
    else
        return 0;
    fi
}
GetP4CommandSyncOutputMessage(){
    $P4COMMAND sync 2>&1
}
# ----------------------------------------------
LoginPerforce
LOG_FILE=$MyProjectLog
# 這一步驟是要將 p4 sync 的結果 assign 給OUTPUT 這個變數
OUTPUT=$(GetP4CommandSyncOutputMessage)
if [[ $(IsCodeChanged $OUTPUT) ]]
then
    LogCodeChanged $LOG_FILE $OUTPUT
    TriggerAutoBuildMyProject
else
    LogNoChange $LOG_FILE $OUTPUT
fi
LogoutPerforce
有沒有發現我這次把主要流程(71-86行)的註解全部刪除了,但是程式碼還是很清楚對不對!這樣一來就算沒有註解也是看得懂這支 shell script 是在做什麼!
正所謂讀程式的時間可是大於寫程式阿~所以就算是寫 shell script 也是要提高他的可讀性才行!除了這個原因,在最後的幾天理我還會介紹一個東西,讓寫函式變的更重要!
![]()